#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "AppConfig.h"
#include "Test/ClientTest.h"
#include "Task/TaskWrapper.h"
#include <Database/QmlSqlWrapper.h>
#include "Tools/UITools.h"

/*
    程序细节执行流程如下:
        1. 程序启动的时候扫描sql获取已经处理好的病例信息
        2. 凑出相关UI需要的数据格式并展示
        3. LeftArea周期触发混编cpp函数，详见AsyncRunner注释
        4. 处理好后触发相关回调并写入文件、数据库，开始下一次循环
        5. 用户点击leftArea的列表相关的信息，搜索数据库拿到相关数据
        6. 用户点击rightArea的表格条目，触发预览相关代码

    note:
        1. 由于现在的网路方案不稳定，所以多用try catch,最起码保证程序崩溃率低
        2. 应用程序的使用方式会比较乱，需要进行很多暴力测试才能上线, 注意
*/


int main(int argc, char *argv[])
{
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
    qputenv("QT_QUICK_CONTROLS_STYLE","Basic");
#else
    qputenv("QT_QUICK_CONTROLS_STYLE","Default");
#endif
    QGuiApplication app(argc, argv);

    // 全局配置
    initAppConfigConst();
    qInstallMessageHandler(customMessageHandler);

    // run test
    ClientTest::run_test();

    // 注册cpp到qml
    // 启动运算流程
    TaskWrapper *taskPtr = new TaskWrapper();
    qmlRegisterSingletonInstance<TaskWrapper>("analysis", 1, 0, "TaskWrapper", taskPtr);
    // sql查询
    QmlSqlWrapper *sqlPtr = new QmlSqlWrapper();
    qmlRegisterSingletonInstance<QmlSqlWrapper>("analysis", 1, 0, "QmlSqlWrapper", sqlPtr);
    // UI工具
    UITools *uiPtr = new UITools();
    qmlRegisterSingletonInstance<UITools>("analysis", 1, 0, "QmlUiWrapper", uiPtr);

    QQmlApplicationEngine engine;
    const QUrl url("qrc:/ClientAnalysis/UI/EMMain.qml");
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
        &app, [url](QObject *obj, const QUrl &objUrl) {
            if (!obj && url == objUrl)
                QCoreApplication::exit(-1);
        }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}
